home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZPCNV.HAS < prev    next >
Text File  |  1997-02-13  |  45KB  |  2,192 lines

  1. *-------------------------------------------------------
  2. *    ZPCNV3.R Ver.3.00
  3. *
  4. *    (C)  ZENJI SOFT
  5. *-------------------------------------------------------
  6.     .include    table.mac
  7.     .include    doscall.mac
  8.     .include    iocscall.mac
  9.     .include    Z_global.mac
  10.     .include    ZMID.MAC
  11.     .include    ZMD.MAC
  12.     .include    ZPCNV.MAC
  13.     .include    error.MAC
  14.  
  15.     .list
  16.     .text
  17. CMN_EXECUTE:    equ    $70
  18. *-------- program start --------
  19.     lea    $10(a0),a0    *メモリブロックの変更
  20.     lea.l    user_sp(pc),a1
  21.     suba.l    a0,a1
  22.     pea    (a1)
  23.     pea    (a0)
  24.     DOS    _SETBLOCK
  25.     addq.w    #8,sp
  26.     tst.l    d0
  27.     bmi    mem_error
  28.  
  29.     lea    work(pc),a6
  30.     lea.l    user_sp(pc),sp    *スタック設定
  31.     move.l    a3,env_bak-work(a6)
  32.  
  33.     move.l    #1024+1024+92+92,-(sp)    *ワーク確保
  34.     DOS    _MALLOC
  35.     addq.w    #4,sp
  36.     move.l    d0,v_buffer-work(a6)
  37.     bmi    mem_error
  38.     add.l    #1024,d0
  39.     move.l    d0,temp_buffer-work(a6)
  40.     add.l    #1024,d0
  41.     move.l    d0,open_fn-work(a6)
  42.     add.l    #92,d0
  43.     move.l    d0,filename-work(a6)
  44.  
  45.     pea    zpcnv3_opt(pc)        *'zpcnv3_opt'
  46.     bsr    search_env
  47.     addq.w    #4,sp
  48.     tst.l    d0
  49.     beq    @f
  50.     move.l    a2,-(sp)
  51.     move.l    d0,a2
  52.     bsr    chk_optsw        *オプションスイッチ
  53.     move.l    (sp)+,a2
  54. @@:
  55.     tst.b    (a2)+        *パラメータある?
  56.     beq    print_hlp
  57.  
  58.     bsr    _skip_spc    *最初のファイル名までスキップ
  59.  
  60.     move.b    (a2),d0
  61.     beq    print_hlp
  62.  
  63.     bsr    chk_optsw        *オプションスイッチ
  64.     bsr    _skip_spc        *最初のファイル名までスキップ
  65.     tst.b    (a2)
  66.     beq    print_hlp
  67.  
  68.     lea    s_name(pc),a3
  69. gets_lp:                *ソースファイル名のゲット
  70.     move.b    (a2)+,d0
  71.     bsr    chk_kanji
  72.     bpl    @f
  73.     move.b    d0,(a3)+        *漢字ケース
  74.     move.b    (a2)+,(a3)+
  75.     bra    gets_lp
  76. @@:
  77.     cmpi.b    #' ',d0
  78.     bls    @f
  79.     move.b    d0,(a3)+
  80.     bra    gets_lp
  81. @@:
  82.     subq.w    #1,a2
  83.     clr.b    (a3)            *end code
  84.                     *拡張子'CNF'セット
  85.     lea    s_name(pc),a3
  86.     clr.b    d1
  87.     cmpi.w    #'..',(a3)
  88.     bne    @f
  89.     addq.w    #2,a3
  90. @@:
  91.     move.l    a3,d3
  92. setfnlp:
  93.     move.b    (a3)+,d0
  94.     bsr    chk_kanji
  95.     bpl    @f
  96.     addq.w    #1,a3
  97.     bra    setfnlp
  98. @@:
  99.     cmpi.b    #'.',d0
  100.     bne    @f
  101.     st.b    d1
  102.     bra    setfnlp
  103. @@:
  104.     cmpi.b    #' ',d0
  105.     bhi    setfnlp
  106.     subq.w    #1,a3
  107.     cmpi.b    #'.',-1(a3)    *ラストの文字が.だけか
  108.     beq    @f
  109.     tst.b    d1        *拡張子省略かどうか
  110.     bne    set_edc_    *省略しなかった
  111.     bra    set_kkc
  112. @@:
  113.     subq.w    #1,a3
  114. set_kkc:
  115.     move.b    #'.',(a3)+    *拡張子をセット
  116.     move.b    #'C',(a3)+
  117.     move.b    #'N',(a3)+
  118.     move.b    #'F',(a3)+
  119.     clr.b    (a3)
  120. set_edc_:
  121.     *(a3)=ソースネームの終端コード
  122.     bsr    _skip_spc
  123.     tst.b    (a2)        *終端コード?
  124.     bne    get_dest_name    出力ファイル名の取りだし
  125. mk_default_nm:            *デフォルトのファイル名を作る
  126.     * < d3.l=始端アドレス
  127.     * X d0/a0,a3
  128.     move.l    d3,a3
  129.     move.l    d3,a0
  130. mdnlp:
  131.     move.b    (a3)+,d0
  132.     beq    do_mdn
  133.     bsr    chk_kanji
  134.     bpl    @f
  135.     addq.w    #1,a3
  136.     bra    mdnlp
  137. @@:
  138.     cmpi.b    #'\',d0
  139.     beq    @f
  140.     cmpi.b    #':',d0
  141.     bne    mdnlp
  142. @@:
  143.     move.l    a3,a0
  144.     bra    mdnlp
  145. do_mdn:
  146.     move.l    a0,a3
  147.     lea    d_name(pc),a0
  148. mdf_lp:
  149.     move.b    (a3)+,d0
  150.     bsr    chk_kanji
  151.     bpl    @f
  152.     move.b    d0,(a0)+
  153.     move.b    (a3)+,(a0)+
  154.     bra    mdf_lp
  155. @@:
  156.     cmpi.b    #' ',d0
  157.     bls    exit_mdf
  158.     cmpi.b    #'.',d0
  159.     beq    exit_mdf
  160.     move.b    d0,(a0)+
  161.     bra    mdf_lp
  162. get_dest_name:            *セーブファイル名のゲット
  163.     cmpi.b    #'.',(a2)
  164.     bne    @f
  165.     cmpi.b    #'.',1(a2)
  166.     bne    @f
  167.     addq.w    #2,a2        *skip '..'
  168. @@:
  169.     lea    d_name(pc),a0
  170.     moveq.l    #0,d1
  171. getd_lp:
  172.     move.b    (a2)+,d0
  173.     bsr    chk_kanji
  174.     bpl    @f
  175.     move.b    d0,(a0)+
  176.     move.b    (a2)+,(a0)+
  177.     bra    getd_lp
  178. @@:
  179.     cmpi.b    #' ',d0
  180.     bls    exit_mdf
  181.     cmpi.b    #'.',d0
  182.     beq    exit_mdf
  183.     move.b    d0,(a0)+
  184.     bra    getd_lp
  185. exit_mdf:            *拡張子
  186.     move.b    #'.',(a0)+
  187.     move.b    #'Z',(a0)+
  188.     move.b    #'P',(a0)+
  189.     move.b    #'D',(a0)+
  190.     clr.b    (a0)+
  191. do_cnv_ope:
  192.     bsr    print_title
  193.  
  194.     lea    s_name(pc),a2
  195.     bsr    fopen
  196.     tst.l    d5
  197.     bmi    ropen_error    *ソースファイル読み込めず
  198.  
  199.     move.w    #32,-(sp)
  200.     pea    d_name(pc)
  201.     DOS    _CREATE
  202.     addq.w    #6,sp
  203.     move.w    d0,sfh-work(a6)    *save file handle
  204.     bmi    wopen_error    *セーブファイル名に異常有り
  205.  
  206.     bsr    read        *d3=size/a5=address
  207.     move.l    d3,d4
  208.     move.l    a5,a4        *top addr
  209.     add.l    a4,d4        *end addr
  210.     move.l    a4,zms_addr-work(a6)
  211.     move.l    #1,line_number-work(a6)
  212.     move.l    a4,line_ptr-work(a6)
  213.     move.l    a4,line_locate-work(a6)
  214.     moveq.l    #0,d0                *グローバルワーク初期化
  215.     move.l    d0,n_of_err-work(a6)
  216.     move.l    d0,err_stock_addr-work(a6)
  217.     move.l    d0,err_stock_size-work(a6)
  218.     move.l    d0,zms_file_id-work(a6)
  219.     move.l    d0,include_depth-work(a6)
  220.  
  221.     lea    compiling(pc),a1    *'COMPILING'
  222.     bsr    prta1
  223.     lea    s_name(pc),a1        *書きだしファイル名表示
  224.     bsr    prta1
  225.     bsr    PTT            *...
  226.  
  227.     moveq.l    #100,d2                *ファイルネームバッファ確保
  228.     move.l    #ID_TEMP,d3            *filename...(0),
  229.     jsr    get_mem-work(a6)        *インクルードしたファイルの読み込みアドレス
  230.     tst.l    d0                *親ソースの最終ドレス
  231.     bmi    m_out_of_memory            *親ソースのコンパイルアドレス(exit_sec)
  232.     move.l    d2,erfn_size-work(a6)
  233.     move.l    a0,erfn_addr-work(a6)
  234.     clr.l    erfn_now-work(a6)
  235. *    clr.l    erfn_recent0-work(a6)
  236. *    clr.l    erfn_recent1-work(a6)
  237.  
  238.     move.l    #$1_0000,d2            *デフォルトバッファサイズ=64kb
  239.     bsr    get_mem
  240.     tst.l    d0
  241.     bmi    mem_error
  242.     move.l    a0,zmd_addr-work(a6)        *保存
  243.     move.l    d2,zmd_size-work(a6)        *保存
  244.     add.l    a0,d2
  245.     move.l    d2,zmd_end-work(a6)
  246.     * global    d4:ソースリストの最終アドレス+1
  247.     *        a0:共通コマンドのコンパイル結果格納先アドレス
  248.     *        a4:現在走査中のソース
  249. cmpl_lp:
  250.     move.l    sp,sp_buf-work(a6)        *スタック保存
  251.     move.l    a4,line_ptr-work(a6)
  252.     bsr    skip_spc
  253.     cmp.l    a4,d4
  254.     bls    compile_end            *終了
  255.     bsr    chk_num
  256.     bpl    goto_reg_adpcm_data_by_no    *数値ならばADPCM登録(V2形式)
  257.     moveq.l    #0,d0
  258.     move.b    d0,now_cmd-work(a6)    *初期化
  259.     move.b    (a4)+,d0
  260.     bsr    chk_kanji
  261.     bpl    @f
  262.                 *全角スキップ
  263.     cmp.l    a4,d4        *1バイト目でファイル終端にきていないかチェック
  264.     bls    m_kanji_break_off
  265.     addq.w    #1,a4        *全角の2バイト目をスキップ
  266.     bra    cmpl_lp
  267. @@:
  268.     cmpi.b    #$0a,d0        *改行
  269.     beq    inc_line
  270.     cmpi.b    #$1a,d0        *ファイル終端
  271.     beq    compile_end    *終了
  272.     cmpi.b    #' ',d0
  273.     bls    cmpl_lp        *SPC以下(spcやtabその他のコントロールコード)なら無視
  274.     cmpi.b    #'#',d0        *#印のコマンド
  275.     beq    shp_com
  276.     cmpi.b    #'.',d0        *#印のコマンド
  277.     beq    shp_com
  278.     cmpi.b    #'/',d0        *コメント行
  279.     beq    skip_comment
  280.     bra    m_syntax_error
  281.  
  282. goto_reg_adpcm_data_by_no    *数値ならばADPCM登録(V2形式)
  283.     move.l    line_number-work(a6),d0        *compile_end以降で使用
  284.     bsr    do_wrt_cmn_l
  285.     move.l    line_ptr-work(a6),d0
  286.     bsr    do_wrt_cmn_l
  287.     bra    reg_adpcm_data_by_no    *数値ならばADPCM登録(V2形式)
  288.  
  289. inc_line:
  290.     pea    cmpl_lp(pc)
  291. cr_line:
  292.     addq.l    #1,line_number-work(a6)
  293.     move.l    a4,line_locate-work(a6)
  294.     move.l    a4,line_ptr-work(a6)
  295.     rts
  296.  
  297. skip_comment:            *case:コメント行(改行を見付けるまでループ)
  298.     pea    cmpl_lp(pc)
  299. do_skip_comment:
  300.     move.w    d0,-(sp)
  301. skcmlp:
  302.     cmp.l    a4,d4
  303.     bls    exit_skcmt    *終了
  304.     move.b    (a4)+,d0
  305.     bsr    chk_kanji    *漢字かどうかチェック
  306.     bpl    @f
  307.     cmp.l    a4,d4
  308.     bls    exit_skcmt    *終了
  309.     move.b    (a4)+,d0
  310.     bra    skcmlp
  311. @@:
  312.     cmpi.b    #$0a,d0        *行終端でコメント終了
  313.     bne    skcmlp
  314.     subq.w    #1,a4
  315. exit_skcmt:
  316.     move.l    a4,line_ptr-work(a6)
  317.     move.w    (sp)+,d0
  318.     rts
  319.  
  320. find_end:            *終端 ')' '}' を見付ける処理
  321.     bsr    skip_spc
  322. @@:
  323.     cmp.l    a4,d4
  324.     beq    m_illegal_command_line
  325.     cmp.b    #'}',(a4)+
  326.     bne    m_illegal_command_line
  327.     bra    cmpl_lp
  328.  
  329. shp_com:                *#コマンド系(.コマンド系)
  330.     bsr    skip_spc
  331.     cmp.l    a4,d4
  332.     bls    m_command_line_break_off
  333.     cmpi.b    #'!',(a4)
  334.     beq    skip_comment        *#!はコメント
  335.     lea    shp_com_tbl-work(a6),a1
  336.     bsr    get_com_no
  337.     bmi    m_syntax_error        *そのようなコマンドはない
  338.     bsr    skip_spc        *skip separater(パラメータ無しのコマンドもあるから)
  339.     add.w    d0,d0
  340.     add.w    d0,d0
  341.     move.l    sc_jmp_tbl(pc,d0.w),d1
  342. tokurei:                    *特例ケース
  343.     tst.w    d0                *include fileならばポインタなし
  344.     beq    @f
  345.     cmpi.w    #$14,d0
  346.     beq    @f
  347.     move.l    line_number-work(a6),d0        *compile_end以降で使用
  348.     bsr    do_wrt_cmn_l
  349.     move.l    line_ptr-work(a6),d0
  350.     bsr    do_wrt_cmn_l
  351. @@:
  352.     jmp    sc_jmp_tbl(pc,d1.l)
  353.  
  354. sc_jmp_tbl:                    *#コマンドのジャンプテーブル
  355.     dc.l    include_file-sc_jmp_tbl        *$00 特例
  356.     dc.l    reg_16bitpcm_timbre-sc_jmp_tbl    *$04 cmn_zmd
  357.     dc.l    reg_16bitpcm_tone-sc_jmp_tbl    *$08 cmn_zmd
  358.     dc.l    reg_8bitpcm_timbre-sc_jmp_tbl    *$0c cmn_zmd
  359.     dc.l    reg_8bitpcm_tone-sc_jmp_tbl    *$10 cmn_zmd
  360.     dc.l    set_adpcm_bank-sc_jmp_tbl    *$14 特例
  361.     dc.l    reg_adpcm_timbre-sc_jmp_tbl    *$18 cmn_zmd
  362.     dc.l    reg_adpcm_tone-sc_jmp_tbl    *$1c cmn_zmd
  363.     dc.l    erase-sc_jmp_tbl        *$20 cmn_zmd
  364.     dc.l    reg_adpcm_data_by_kc-sc_jmp_tbl    *$24 cmn_zmd
  365.     dc.l    execute-sc_jmp_tbl        *$28 特例(ZPCNV3.R専用ZMSコマンド)
  366. sc_jmp_tbl_end:                    *特例ケースはラベル「tokurei:」を併せて変更
  367.  
  368. reglist    reg    d1-d2/a3
  369. get_com_no:            *コマンド文字列->数値変換
  370.     * < a1=com_tbl
  371.     * < a4=pointer
  372.     * < d4.l=area border addr.
  373.     * > d0=#cmd number
  374.     * minus error
  375.     * X a1
  376.     movem.l    reglist,-(sp)
  377.     bsr    skip_spc2
  378.     moveq.l    #0,d2
  379. wc_lp01:
  380.     tst.b    (a1)
  381.     bmi    exit_err_wc
  382.     bsr    do_get_cmd_num
  383.     beq    exit_wc
  384. @@:
  385.     tst.b    (a1)+        *次のコマンド名へ
  386.     bne    @b
  387.     addq.b    #1,d2        *cmd number
  388.     bra    wc_lp01
  389. exit_err_wc:
  390.     moveq.l    #-1,d0        *couldn't find it...
  391.     movem.l    (sp)+,reglist
  392.     rts
  393. exit_wc:
  394.     move.l    d2,d0        *d0=cmd number
  395.     movem.l    (sp)+,reglist
  396.     rts
  397.  
  398. do_get_cmd_num:            *実際に文字列を捜す
  399.     * < a1=source str addr
  400.     * > eq=get it!
  401.     * > mi=can't found
  402.     move.l    a1,-(sp)
  403.     move.l    a4,d1        *save a4 to d1
  404. @@:
  405.     cmp.l    a4,d4
  406.     bls    not_same_dgscn    *途中で終わった
  407.     move.b    (a4)+,d0
  408.     jsr    mk_capital-work(a6)    *小文字→大文字
  409.     cmp.b    (a1)+,d0
  410.     bne    not_same_dgscn
  411.     tst.b    (a1)        *終了
  412.     bne    @b
  413.     move.l    (sp)+,a1
  414.     moveq.l    #0,d0        *right!
  415.     rts
  416. not_same_dgscn:
  417.     move.l    d1,a4        *get back a4
  418.     move.l    (sp)+,a1
  419.     moveq.l    #-1,d0        *error!
  420.     rts
  421.  
  422. execute:                *「外部コマンド実行」コンパイル
  423.     moveq.l    #CMN_EXECUTE,d0
  424.     bsr    do_wrt_cmn_b
  425.     moveq.l    #0,d3
  426.     bsr    skip_eq
  427.     cmpi.b    #'{',(a4)
  428.     bne    @f
  429.     addq.w    #1,a4
  430.     moveq.l    #-1,d3
  431. @@:
  432.     move.l    a0,a2            *チェックで使用
  433.     bsr    skip_spc2
  434. exefnstr_lp:                *filename,option転送
  435.     move.b    (a4),d0
  436.     bsr    chk_kanji        *漢字かどうかチェック
  437.     bmi    @f
  438.     cmpi.b    #$0d,d0
  439.     beq    set_exfnedcd
  440.     cmpi.b    #$0a,d0
  441.     beq    set_exfnedcd
  442.     bsr    do_wrt_cmn_b
  443.     addq.w    #1,a4
  444.     cmp.l    a4,d4
  445.     bhi    exefnstr_lp
  446.     bra    m_illegal_command_line
  447. @@:                    *漢字ケース
  448.     bsr    do_wrt_cmn_b
  449.     addq.w    #1,a4
  450.     cmp.l    a4,d4
  451.     bls    m_string_break_off
  452.     move.b    (a4)+,d0
  453.     bsr    do_wrt_cmn_b
  454.     cmp.l    a4,d4
  455.     bhi    exefnstr_lp
  456.     bra    m_illegal_command_line
  457. set_exfnedcd:
  458.     cmp.l    a2,a0
  459.     beq    m_illegal_command_line
  460.     moveq.l    #0,d0
  461.     bsr    do_wrt_cmn_b
  462.     tst.b    d3
  463.     bne    find_end
  464.     bra    cmpl_lp
  465.  
  466.     .include    pcmproc.has
  467.     .include    include.has
  468.  
  469. do_wrt_cmn_b:            *共通コマンドエリアにbyte書き込み(共通コマンド時)
  470.     * < d0.b=data
  471.     move.b    d0,(a0)+
  472.     bra    chk_membdr_cmn
  473.  
  474. do_wrt_cmn_w:            *共通コマンドエリアにword書き込み(共通コマンド時)
  475.     * < d0.w=data
  476.     rol.w    #8,d0
  477.     move.b    d0,(a0)+
  478.     bsr    chk_membdr_cmn
  479.     rol.w    #8,d0
  480.     move.b    d0,(a0)+
  481.     bra    chk_membdr_cmn
  482.  
  483. do_wrt_cmn_l:            *共通コマンドエリアにlong word書き込み(共通コマンド時)
  484.     * < d0.l=data
  485.     rol.l    #8,d0
  486.     move.b    d0,(a0)+
  487.     bsr    chk_membdr_cmn
  488.  
  489.     rol.l    #8,d0
  490.     move.b    d0,(a0)+
  491.     bsr    chk_membdr_cmn
  492.  
  493.     rol.l    #8,d0
  494.     move.b    d0,(a0)+
  495.     bsr    chk_membdr_cmn
  496.  
  497.     rol.l    #8,d0
  498.     move.b    d0,(a0)+
  499.  
  500. chk_membdr_cmn:            *メモリ境界チェック(共通コマンド時)
  501.     * < a0.l
  502.     * - all
  503.     * x d0
  504.     cmp.l    zmd_end(pc),a0
  505.     bcs    exit_cmz    *no error
  506.     movem.l    d2-d3/a1,-(sp)
  507.     move.l    zmd_addr(pc),a1
  508.     suba.l    a1,a0
  509.     move.l    a0,d3
  510.     move.l    zmd_size(pc),d2
  511.     add.l    #$1_0000,d2
  512.     bsr    enlarge_mem
  513.     tst.l    d0
  514.     bmi    m_out_of_memory
  515.     move.l    d2,zmd_size-work(a6)
  516.     move.l    a0,zmd_addr-work(a6)
  517.     add.l    a0,d2
  518.     move.l    d2,zmd_end-work(a6)
  519.     add.l    d3,a0
  520.     movem.l    (sp)+,d2-d3/a1
  521. exit_cmz:
  522.     rts
  523.  
  524. compile_end:            *テーブルの整理
  525.     tst.l    include_depth-work(a6)        *includeしたファイルが
  526.     bne    pop_include_ope            *コンパイル終了したに過ぎない
  527.  
  528.     tst.l    n_of_err-work(a6)
  529.     bne    error_occurred
  530.  
  531.     moveq.l    #0,d0
  532.     bsr    do_wrt_cmn_l        *endcode
  533.     bsr    do_wrt_cmn_l        *endcode
  534.     moveq.l    #-1,d0
  535.     bsr    do_wrt_cmn_b        *endcode
  536.  
  537.     bsr    OK
  538.  
  539.     move.l    sp,sp_buf-work(a6)    *スタック保存
  540.     move.l    zmd_addr(pc),a2
  541.     * < a2=comn data addr
  542.     * X d0-d2,a0-a2/a5
  543. pcd_lp01:
  544.     bsr    get_cm_l        *エラー時に対策
  545.     move.l    d0,line_number-work(a6)
  546.     bsr    get_cm_l
  547.     move.l    d0,line_ptr-work(a6)
  548.     move.l    d0,line_locate-work(a6)
  549.     clr.b    OVW_flag-work(a6)
  550.     move.b    (a2)+,d0
  551.     bmi    assemble_zpd        *共通コマンドエンド
  552.     cmp.b    #CMN_REGISTER_PCM,d0
  553.     beq    cmn_register_pcm    *adpcm data cnf
  554.     cmp.b    #CMN_ERASE_PCM,d0
  555.     beq    cmn_erase_pcm        *erase adpcm
  556.     cmp.b    #CMN_EXECUTE,d0
  557.     beq    cmn_execute        *execute external command
  558.     bra    t_undefined_zmd_code
  559.  
  560. cmn_register_pcm:
  561.     bsr    get_cm_l
  562.     move.l    d0,d1        *flag of option existance/reg note number
  563.     bsr    disp_kctmb
  564.     bsr    get_cm_l
  565.     move.l    d0,d2        *d2.l=data type.b/original key code
  566.     tst.l    d1
  567.     bpl    @f
  568.     lea    proc(pc),a1        *'PROCESSING'
  569.     bsr    prta1
  570. @@:
  571.     movea.l    a2,a1
  572.     bsr    pcm_read
  573.     move.l    a0,a2        *a2=更新された
  574.     lea    ovw_reg_mes(pc),a1
  575.     tst.b    OVW_flag-work(a6)    *上書きがあったか無かったか
  576.     bne    @f
  577.     lea    reg_mes(pc),a1
  578. @@:
  579.     bsr    prta1        *bank
  580.     bra    pcd_lp01
  581.  
  582. cmn_erase_pcm:
  583.     bsr    get_cm_w
  584.     move.w    d0,d1        *d1.w=note number to erase
  585.     bsr    disp_kctmb
  586.     suba.l    a1,a1        *a1.l=0:erase_mode
  587.     bsr    pcm_read
  588.     lea    ers_mes(pc),a1    *erased
  589.     bsr    prta1
  590.     bra    pcd_lp01
  591.  
  592. cmn_execute:                *「外部コマンド実行」実行
  593.     lea    executing(pc),a1
  594.     bsr    prta1
  595.  
  596.     move.l    a2,a1
  597.     bsr    prta1
  598.  
  599.     bsr    RET
  600.  
  601.     move.l    #2048,d2
  602.     bsr    get_temp_buf        *d2サイズ分確保(>a1.l=data area)
  603.     bmi    t_out_of_memory
  604.     move.l    a1,a3
  605. @@:                    *コマンドラインのコピー
  606.     move.b    (a2)+,(a3)+
  607.     bne    @b
  608.     movem.l    d0-d7/a0-a7,prsv_work-work(a6)
  609.     clr.l    -(sp)
  610.     pea    1024(a1)        *使い捨てとなるわけだからどこでもいい
  611.     pea    (a1)            *command line
  612.     move.w    #2,-(sp)        *mode
  613.     DOS    _EXEC
  614.     addq.w    #2,sp
  615.     clr.w    -(sp)            *mode
  616.     DOS    _EXEC
  617.     lea    14(sp),sp
  618.     movem.l    prsv_work(pc),d0-d7/a0-a7
  619.     bsr    free_mem
  620.     bra    pcd_lp01
  621.  
  622. disp_kctmb:            *ノート番号/音色番号表示
  623.     * < d0.w=note/timbre number
  624. reglist    reg    d0/d2/a1
  625.     movem.l    reglist,-(sp)
  626.     lea    tone_mes(pc),a1
  627.     tst.w    d0
  628.     bpl    @f
  629.     lea    timbre_mes(pc),a1
  630.     andi.l    #$7fff,d0
  631.     move.l    d0,d2
  632.     andi.l    #$7f,d2
  633.     lsr.l    #7,d0
  634.     bsr    num_to_str
  635.     bsr    prta1        *TIMBRE
  636.     move.w    #' ',-(sp)
  637.     DOS    _PUTCHAR
  638.     addq.w    #2,sp
  639.     lea    suji(pc),a1
  640.     bsr    prta1        *bank
  641.     move.w    #':',-(sp)
  642.     DOS    _PUTCHAR
  643.     addq.w    #2,sp
  644.     move.l    d2,d0
  645.     addq.l    #1,d0        *inc
  646.     bsr    num_to_str
  647.     lea    suji(pc),a1
  648.     bsr    prta1        *timbre number
  649.     bra    1f
  650. @@:
  651.     andi.l    #$7fff,d0
  652.     move.l    d0,d2
  653.     andi.l    #$7f,d2
  654.     lsr.l    #7,d0
  655.     addq.l    #1,d0        *inc
  656.     bsr    num_to_str
  657.     bsr    prta1        *NOTE
  658.     move.w    #' ',-(sp)
  659.     DOS    _PUTCHAR
  660.     addq.w    #2,sp
  661.     lea    suji(pc),a1
  662.     bsr    prta1        *bank
  663.     move.w    #':',-(sp)
  664.     DOS    _PUTCHAR
  665.     addq.w    #2,sp
  666.     divu    #12,d2
  667.     move.w    d2,d0
  668.     lsl.w    #2,d0
  669.     pea    octntbl(pc,d0.w)
  670.     swap    d2
  671.     move.w    d2,d0        *0-11
  672.     lsl.w    #2,d0
  673.     lea    kc0_11(pc,d0.w),a1
  674.     bsr    prta1        *KC
  675.     move.l    (sp)+,a1
  676.     bsr    prta1        *ocatve
  677. 1:
  678.     bsr    PTT        *...
  679.     movem.l    (sp)+,reglist
  680.     rts
  681.  
  682. kc0_11:
  683.     dc.b    'C ',0,0
  684.     dc.b    'C#',0,0
  685.     dc.b    'D ',0,0
  686.     dc.b    'D#',0,0
  687.     dc.b    'E ',0,0
  688.     dc.b    'F ',0,0
  689.     dc.b    'F#',0,0
  690.     dc.b    'G ',0,0
  691.     dc.b    'G#',0,0
  692.     dc.b    'A ',0,0
  693.     dc.b    'A#',0,0
  694.     dc.b    'B ',0,0
  695.  
  696. octntbl:
  697.     dc.b    '-1',0,0
  698.     dc.b    '0 ',0,0
  699.     dc.b    '1 ',0,0
  700.     dc.b    '2 ',0,0
  701.     dc.b    '3 ',0,0
  702.     dc.b    '4 ',0,0
  703.     dc.b    '5 ',0,0
  704.     dc.b    '6 ',0,0
  705.     dc.b    '7 ',0,0
  706.     dc.b    '8 ',0,0
  707.     dc.b    '9 ',0,0
  708.  
  709. get_cm_w:
  710.     move.b    (a2)+,d0
  711.     lsl.w    #8,d0
  712.     move.b    (a2)+,d0
  713.     rts
  714.  
  715. get_cm_l:
  716.     move.b    (a2)+,d0
  717.     lsl.w    #8,d0
  718.     move.b    (a2)+,d0
  719.     swap    d0
  720.     move.b    (a2)+,d0
  721.     lsl.w    #8,d0
  722.     move.b    (a2)+,d0
  723.     rts
  724.  
  725.     .include    pcm_read.has
  726.  
  727. t_dat_ok:
  728.     moveq.l    #0,d0
  729. clr_adpb?:
  730.     rts
  731.  
  732. assemble_zpd:
  733.     tst.l    n_of_err-work(a6)
  734.     bne    error_occurred2
  735.  
  736.     lea    saving(pc),a1        *'CREATING'
  737.     bsr    prta1
  738.     lea    d_name(pc),a1        *書きだしファイル名表示
  739.     bsr    prta1
  740.     bsr    PTT            *...
  741.  
  742.     move.w    sfh(pc),d5        *file handle
  743.  
  744.     moveq.l    #16,d4            *offset=8
  745.     move.l    d4,-(sp)        *ヘッダ書き込み
  746.     pea    zpdhdr(pc)
  747.     move.w    d5,-(sp)
  748.     DOS    _WRITE
  749.     lea    10(sp),sp
  750.     cmp.l    #16,d0
  751.     bne    write_error
  752.  
  753.     moveq.l    #0,d6            *total count
  754.     move.w    adpcm_n_max(pc),d2
  755.     beq    @f
  756.     subq.w    #1,d2            *for dbra
  757.     moveq.l    #0,d1
  758.     move.l    adpcm_tbl(pc),a0
  759.     bsr    do_asm_zpd_tbl
  760. @@:
  761.     move.w    adpcm_n_max2(pc),d2
  762.     beq    @f
  763.     subq.w    #1,d2            *for dbra
  764.     move.w    #$8000,d1
  765.     move.l    adpcm_tbl2(pc),a0
  766.     bsr    do_asm_zpd_tbl
  767. @@:
  768.     clr.w    -(sp)            *write total count
  769.     move.l    #12,-(sp)
  770.     move.w    d5,-(sp)
  771.     DOS    _SEEK
  772.     addq.w    #8,sp
  773.  
  774.     rept    4
  775.     rol.l    #8,d6
  776.     move.w    d5,-(sp)        *total count
  777.     move.w    d6,-(sp)
  778.     DOS    _FPUTC
  779.     addq.w    #4,sp
  780.     endm
  781.  
  782. *    moveq.l    #16,d1            *offset
  783.  
  784.     move.w    adpcm_n_max(pc),d2
  785.     beq    @f
  786.     subq.w    #1,d2            *for dbra
  787.     move.l    adpcm_tbl(pc),a0
  788.     bsr    do_asm_pcm_data
  789. @@:
  790.     move.w    adpcm_n_max2(pc),d2
  791.     beq    @f
  792.     subq.w    #1,d2            *for dbra
  793.     move.l    adpcm_tbl2(pc),a0
  794.     bsr    do_asm_pcm_data
  795. @@:
  796.     move.l    date_buf(pc),-(sp)
  797.     move.w    d5,-(sp)
  798.     DOS    _FILEDATE
  799.     addq.w    #6,sp
  800.  
  801.     DOS    _ALLCLOSE
  802.  
  803.     bsr    OK
  804.  
  805.     lea    no_er_mes(pc),a1
  806.     bsr    prta1
  807.  
  808.     pea    0.w
  809.     DOS    _MFREE
  810.     addq.w    #4,sp
  811.  
  812.     DOS    _EXIT
  813.  
  814. do_asm_zpd_tbl:                *テーブルの集配
  815.     * < d1.w=$0000:tone/$8000:timbre
  816.     * < d2.w=adpcm_n_maxX
  817.     * < a0.l=adpcm_tableX
  818.     * < d4.l=offset
  819.     * < d5.w=file handle
  820.     * < d6.l=total count of data
  821.     * x d0,d2,d3,d4,a1,a2,a3
  822.     move.l    a0,a3
  823.     move.l    d2,d3
  824. asmzpdlp:
  825.     tst.b    (a0)
  826.     beq    asmzpd_next
  827.     lea.l    adt_name(a0),a2        *名前バッファを使わせてもらう
  828.     addq.l    #1,d6            *inc total count
  829.     move.l    d4,d0
  830.     add.l    #adt_addr+2,d0
  831.     move.l    adt_size(a0),-(sp)
  832.     move.l    adt_addr(a0),-(sp)
  833.     move.l    d0,-(sp)
  834.     add.l    #adt_name+2,d4
  835.     bcs    mem_error
  836.  
  837.     rept    2
  838.     rol.w    #8,d1
  839.     move.w    d5,-(sp)        *note/timbre number
  840.     move.w    d1,-(sp)
  841.     DOS    _FPUTC
  842.     addq.w    #4,sp
  843.     endm
  844.  
  845.     move.l    #adt_name,-(sp)        *テーブル書き込み(without name)
  846.     pea    (a0)
  847.     move.w    d5,-(sp)
  848.     DOS    _WRITE
  849.     lea    10(sp),sp
  850.     cmp.l    #32,d0
  851.     bne    write_error
  852. asmzpdname:
  853.     tst.b    adt_name(a0)
  854.     beq    @f
  855.     move.w    d5,-(sp)        *name出力
  856.     pea    adt_name(a0)
  857.     DOS    _FPUTS
  858.     addq.w    #6,sp
  859. @@:
  860.     move.w    d5,-(sp)        *endcode
  861.     clr.w    -(sp)
  862.     DOS    _FPUTC
  863.     addq.w    #4,sp
  864.     lea    adt_name(a0),a1
  865. @@:
  866.     addq.l    #1,d4
  867.     bcs    mem_error
  868.     tst.b    (a1)+
  869.     bne    @b
  870.  
  871.     btst.l    #0,d4            *偶数に揃える
  872.     beq    memo_rwofst
  873.     addq.l    #1,d4
  874.     bcs    mem_error
  875.     move.w    d5,-(sp)        *endcode
  876.     clr.w    -(sp)
  877.     DOS    _FPUTC
  878.     addq.w    #4,sp
  879. memo_rwofst:
  880.     move.l    (sp)+,(a2)+        *書き換えるべきファイルオフセットをメモ
  881.     btst.b    #0,adt_attribute(a0)    *ポインタコピーの場合はデータそのものの出力は無し
  882.     bne    @f
  883.     move.l    (sp)+,(a2)+        *アドレス
  884.     move.l    (sp)+,(a2)+        *サイズ
  885.     bra    asmzpd_next
  886. @@:
  887.     move.l    (sp)+,d0        *アドレス
  888.     bsr    scan_src_ptr        *> a1.l=該当テーブル
  889.     sub.l    adt_addr(a1),d0
  890.     move.l    d0,(a2)+        *ポイントオフセットアドレス
  891.     move.l    (sp)+,(a2)+        *サイズ
  892.     move.l    a1,(a2)+        *該当テーブルを保存
  893. asmzpd_next:
  894.     addq.w    #1,d1
  895.     lea    adpcm_tbl_size(a0),a0
  896.     dbra    d2,asmzpdlp
  897.     rts
  898.  
  899. scan_src_ptr:
  900.     * < d0.l=検索キー(アドレス)
  901.     * > a1.l=該当アドレス
  902. reglist    reg    d0-d1/d3/a3
  903.     movem.l    reglist,-(sp)
  904.     suba.l    a1,a1            *a1=0(dummy)
  905.     move.w    adpcm_n_max(pc),d3
  906.     beq    @f
  907.     subq.w    #1,d3            *for dbra
  908.     move.l    adpcm_tbl(pc),a3
  909.     bsr    do_scan_src_ptr
  910. @@:
  911.     move.l    a1,d1
  912.     suba.l    a1,a1            *a1=0(dummy)
  913.     move.w    adpcm_n_max2(pc),d3
  914.     beq    @f
  915.     subq.w    #1,d3            *for dbra
  916.     move.l    adpcm_tbl2(pc),a3
  917.     bsr    do_scan_src_ptr
  918. @@:
  919.     cmp.l    a1,d1
  920.     bls    @f
  921.     move.l    d1,a1            *後半の検索結果を該当データとする
  922. @@:
  923.     move.l    a1,d0            *ただし0(dummy)のままではエラー
  924.     beq    pointer_error
  925.     movem.l    (sp)+,reglist
  926.     rts
  927.  
  928. do_scan_src_ptr:
  929. ssplp:
  930.     tst.b    (a3)
  931.     beq    @f
  932.     tst.b    adt_attribute(a3)    *ポインタコピーによる登録なので検索対象外
  933.     bne    @f
  934.     cmp.l    a3,a0
  935.     beq    @f
  936.     cmp.l    adt_addr(a3),d0
  937.     bcs    @f
  938.     move.l    a3,a1
  939. @@:
  940.     lea    adpcm_tbl_size(a3),a3
  941.     dbra    d3,ssplp
  942. 1:
  943.     rts
  944.  
  945. do_asm_pcm_data:            *PCM DATAのアセンブル
  946.     * < d2.w=adpcm_n_maxX
  947.     * < a0.l=adpcm_tableX
  948.     * < d4.l=offset
  949.     * < d5.w=file handle
  950.     * x d0,d2,d3,d4,a1,a2
  951. dapdlp:
  952.     tst.b    (a0)
  953.     beq    dapd_next
  954.     lea    adt_name(a0),a2
  955.     move.l    (a2)+,d1        *rewrite offset
  956.     clr.w    -(sp)
  957.     move.l    d1,-(sp)
  958.     move.w    d5,-(sp)
  959.     DOS    _SEEK
  960.     addq.w    #8,sp
  961.  
  962.     btst.b    #0,adt_attribute(a0)
  963.     beq    1f
  964.                     *ポインタコピーの場合
  965.     move.l    (a2)+,d3        *ポイントオフセットアドレス
  966.     addq.w    #4,a2
  967.     move.l    (a2)+,a1        *該当テーブル
  968.     add.l    adt_addr(a1),d3
  969.     addq.l    #4,d1
  970.     sub.l    d1,d3
  971.     rept    4
  972.     rol.l    #8,d3
  973.     move.w    d5,-(sp)        *offset to pcm data
  974.     move.w    d3,-(sp)
  975.     DOS    _FPUTC
  976.     addq.w    #4,sp
  977.     endm
  978.     bra    dapd_next
  979. 1:
  980.     addq.l    #4,d1
  981.     move.l    d4,d3
  982.     addq.l    #1,d3
  983.     bclr.l    #0,d3            *.even
  984.     sub.l    d1,d3
  985.     rept    4
  986.     rol.l    #8,d3
  987.     move.w    d5,-(sp)        *offset to pcm data
  988.     move.w    d3,-(sp)
  989.     DOS    _FPUTC
  990.     addq.w    #4,sp
  991.     endm
  992.  
  993.     clr.w    -(sp)
  994.     move.l    d4,-(sp)
  995.     move.w    d5,-(sp)
  996.     DOS    _SEEK
  997.     addq.w    #8,sp
  998.  
  999.     btst.l    #0,d4            *.even
  1000.     beq    @f
  1001.     addq.l    #1,d4
  1002.     move.w    d5,-(sp)
  1003.     clr.w    -(sp)            *dummy
  1004.     DOS    _FPUTC
  1005.     addq.w    #4,sp
  1006. @@:
  1007.     move.l    d4,adt_addr(a0)        *ポインタ登録方式のためにデータ部分のオフセット保存
  1008.     move.l    (a2)+,d1        *addr
  1009.     move.l    (a2)+,d3        *size
  1010.     move.l    d3,-(sp)
  1011.     move.l    d1,-(sp)
  1012.     move.w    d5,-(sp)
  1013.     DOS    _WRITE            *データ部分の書きだし
  1014.     lea    10(sp),sp
  1015.     cmp.l    d0,d3
  1016.     bne    dev_full        *全部書き出せなかったということはデバイスフル
  1017.  
  1018.     add.l    d3,d4
  1019.     bcs    mem_error
  1020. dapd_next:
  1021.     lea    adpcm_tbl_size(a0),a0
  1022.     dbra    d2,dapdlp
  1023.     rts
  1024.  
  1025. error_occurred:                *エラー表示
  1026.     bsr    RET            *とりあえず改行
  1027.     move.l    err_stock_addr(pc),a0
  1028.     moveq.l    #0,d1
  1029.     move.b    errmes_lang-work(a6),d1
  1030.     move.l    n_of_err(pc),d2
  1031.     lea    s_name(pc),a3
  1032.     move.l    zms_addr(pc),a2
  1033.     suba.l    a1,a1
  1034.     bsr    do_prt_err_mes
  1035.     move.l    a0,a1
  1036.     bsr    free_mem
  1037.     bra    go_bye            *エラー終了
  1038.  
  1039. error_occurred2:            *エラー表示
  1040.     bsr    RET            *とりあえず改行
  1041.     move.l    err_stock_addr(pc),a0
  1042.     moveq.l    #0,d1
  1043.     move.b    errmes_lang-work(a6),d1
  1044.     move.l    n_of_err(pc),d2
  1045.     suba.l    a3,a3            *src name=0
  1046.     move.l    a3,a2            *src addr=0
  1047.     lea    d_name(pc),a1
  1048.     bsr    do_prt_err_mes
  1049.     move.l    a0,a1
  1050.     bsr    free_mem
  1051.     bra    go_bye            *エラー終了
  1052.  
  1053. PUTCHAR    macro
  1054.     DOS    _PUTCHAR
  1055.     endm
  1056.  
  1057. PRINT    macro
  1058.     DOS    _PRINT
  1059.     endm
  1060.  
  1061.     .include    prterrms.has
  1062.  
  1063. t_offset_too_long:    m_err    OFFSET_TOO_LONG
  1064. t_processing_size_too_large:    m_err    PROCESSING_SIZE_TOO_LARGE
  1065. t_empty_note_number:    m_err    EMPTY_NOTE_NUMBER
  1066. t_illegal_tone_number:    m_err    ILLEGAL_TONE_NUMBER
  1067. t_illegal_timbre_number:    m_err    ILLEGAL_TIMBRE_NUMBER
  1068. *t_illegal_note_no:    m_err    ILLEGAL_NOTE_NUMBER
  1069. t_illegal_parameters_combination:    m_err    ILLEGAL_PARAMETERS_COMBINATION
  1070.  
  1071. t_undefined_zmd_code:    err    UNDEFINED_ZMD_CODE
  1072. t_out_of_memory:    err    OUT_OF_MEMORY
  1073. t_file_not_found:            *ファイルネームをサブ情報としてもつ
  1074.     move.l    #FILE_NOT_FOUND,d0
  1075.     bra    @f
  1076.  
  1077. t_illegal_file_size:            *ファイルネームをサブ情報としてもつ
  1078.     move.l    #ILLEGAL_FILE_SIZE,d0
  1079.     bra    @f
  1080.  
  1081. t_read_error:                *ファイルネームをサブ情報としてもつ
  1082.     move.l    #READ_ERROR,d0
  1083. @@:
  1084.     move.l    d0,-(sp)
  1085.     bsr    set_err_code
  1086.     move.l    fopen_name(pc),d0
  1087.     bsr    set_err_code        *set error code(fopenで最後に取り扱ったfilename)
  1088.     moveq.l    #0,d0
  1089.     bsr    set_err_code        *set error code(dummy)
  1090.     bsr    set_err_code        *set error code(dummy)
  1091.     bra    inc_n_of_err
  1092.  
  1093. m_file_not_found:            m_err    FILE_NOT_FOUND
  1094. m_too_many_include_files:        m_err    TOO_MANY_INCLUDE_FILES
  1095. m_recusive_include_error:        m_err    RECUSIVE_INCLUDE_ERROR
  1096. m_missing_filename:            m_err    MISSING_FILENAME
  1097. m_syntax_error:                m_err    SYNTAX_ERROR
  1098. m_kanji_break_off:            m_err    KANJI_BREAK_OFF
  1099. m_illegal_command_line:            m_err    ILLEGAL_COMMAND_LINE
  1100. m_illegal_parameter_format:        m_err    ILLEGAL_PARAMETER_FORMAT
  1101. m_command_line_break_off:        m_err    COMMAND_LINE_BREAK_OFF
  1102. m_illegal_tone_number:            m_err    ILLEGAL_TONE_NUMBER
  1103. m_parameter_cannot_be_omitted:        m_err    PARAMETER_CANNOT_BE_OMITTED
  1104. m_illegal_bank_number:            m_err    ILLEGAL_BANK_NUMBER
  1105. m_illegal_operand:            m_err    ILLEGAL_OPERAND
  1106. m_parameter_shortage:            m_err    PARAMETER_SHORTAGE
  1107. m_string_break_off:            m_err    STRING_BREAK_OFF
  1108. m_illegal_nesting_error:        m_err    ILLEGAL_NESTING_ERROR
  1109. m_undefined_ppc:            m_err    UNDEFINED_PPC
  1110. m_illegal_pitch_value:            m_err    ILLEGAL_PITCH_VALUE
  1111. m_illegal_parameters_combination:    m_err    ILLEGAL_PARAMETERS_COMBINATION
  1112. m_missing_operand:            m_err    MISSING_OPERAND
  1113. m_illegal_frequency_value:        m_err    ILLEGAL_FREQUENCY_VALUE
  1114. m_illegal_volume_value:            m_err    ILLEGAL_VOLUME_VALUE
  1115. m_undefined_loop_type:            m_err    UNDEFINED_LOOP_TYPE
  1116. m_illegal_timbre_number:        m_err    ILLEGAL_TONE_NUMBER
  1117. m_illegal_note_number:            m_err    ILLEGAL_NOTE_NUMBER
  1118. m_illegal_octave:            m_err    ILLEGAL_OCTAVE
  1119. m_unexpected_operand:            m_err    UNEXPECTED_OPERAND
  1120. m_illegal_filename:            m_err    ILLEGAL_FILENAME
  1121. m_cut_off_level_too_big:        m_err    CUT_OFF_LEVEL_TOO_BIG
  1122. m_illegal_repeat_time:            m_err    ILLEGAL_REPEAT_TIME
  1123.  
  1124. m_out_of_memory:                    *コンパイル時
  1125.     move.l    sp_buf(pc),sp
  1126.     move.l    #ZM_ZPCNV*65536+OUT_OF_MEMORY,d0
  1127.     bsr    set_err_code_for_compile        *メモリ不足の場合は即座に
  1128.     addq.l    #1,n_of_err-work(a6)            *inc error count
  1129.     bra    compile_end                *コンパイル処理を打ち切る
  1130.  
  1131. m_error_code_exit:        *その値がエラーコード
  1132.     bsr    set_err_code_for_compile
  1133.     addq.l    #1,n_of_err-work(a6)    *inc error count
  1134.     move.l    sp_buf(pc),sp    *スタック補正
  1135.                 *エラーの発生した行を飛ばして
  1136.     cmp.l    a4,d4        *次の行のコンパイルに望む
  1137.     bls    compile_end    *終了
  1138. doscanedcdlp:
  1139.     bsr    skip_spc
  1140.     cmp.l    a4,d4        *次の行のコンパイルに望む
  1141.     bls    compile_end    *終了
  1142.     move.b    (a4)+,d0
  1143.     bsr    chk_kanji
  1144.     bpl    @f
  1145.     addq.w    #1,a4
  1146.     bra    doscanedcdlp
  1147. @@:
  1148.     cmpi.b    #'/',d0
  1149.     bne    @f
  1150.     bsr    do_skip_comment
  1151.     bra    doscanedcdlp
  1152. @@:
  1153.     cmp.b    #$0a,d0
  1154.     beq    1f
  1155.     cmpi.b    #$1a,d0
  1156.     bne    doscanedcdlp
  1157. 1:
  1158.     subq.w    #1,a4
  1159.     bra    cmpl_lp
  1160.  
  1161. t_error_code_exit:            *d0.lがそのままエラーコード
  1162.     * < d0.l=error code
  1163.     move.l    d0,-(sp)
  1164.     bsr    set_err_code        *set error code
  1165.     moveq.l    #0,d0
  1166.     bsr    set_err_code        *set error code(dummy)
  1167.     bsr    set_err_code        *set error code(dummy)
  1168.     bsr    set_err_code        *set error code(dummy)
  1169. inc_n_of_err:
  1170.     addq.l    #1,n_of_err-work(a6)
  1171.     bsr    do_fclose        *openしているファイルがあればそれを閉じる
  1172.     suba.l    a0,a0            *error mark
  1173.     move.l    (sp)+,d0
  1174.     bset.l    #31,d0            *error mark
  1175.     move.l    sp_buf-work(a6),sp
  1176.     bra    error_occurred2        *処理中断して終了処理へ
  1177.  
  1178. set_err_code_for_compile:
  1179.     bsr    set_err_code
  1180.     move.l    include_depth(pc),d0
  1181.     beq    @f
  1182.     move.l    zms_file_id(pc),d0        *filename[n]
  1183. @@:
  1184.     bsr    set_err_code
  1185.     move.l    line_number(pc),d0        *追加エラー情報
  1186.     bsr    set_err_code
  1187.     move.l    line_ptr(pc),d0
  1188.     sub.l    line_locate(pc),d0
  1189.  
  1190. set_err_code:                    *エラーコードのストック
  1191.     * < d0.l=error code
  1192.     * - all
  1193. reglist    reg    d0-d5/a0-a1
  1194.     movem.l    reglist,-(sp)
  1195.     move.l    d0,d4            *main info
  1196.     move.l    err_stock_now(pc),d1
  1197.     move.l    err_stock_addr(pc),d0
  1198.     bne    case_erstk_enlg
  1199.     move.l    #256,d2            *初期値は256バイト
  1200.     bsr    get_mem
  1201.     tst.l    d0
  1202.     bmi    exit_sec
  1203.     move.l    d2,err_stock_size-work(a6)
  1204.     move.l    a0,err_stock_addr-work(a6)
  1205. store_ercd:
  1206.     move.l    d0,a0
  1207.     add.l    d1,a0
  1208. store_ercd_:
  1209.     move.l    d4,(a0)+        *エラー情報格納
  1210.     sub.l    err_stock_addr(pc),a0
  1211.     move.l    a0,err_stock_now-work(a6)
  1212. exit_sec:
  1213.     movem.l    (sp)+,reglist
  1214. do_exit_sec:
  1215.     rts
  1216. case_erstk_enlg:            *メモリ領域拡大の場合
  1217.     cmp.l    err_stock_size(pc),d1    *d1.l=現在の書き込み目的オフセット
  1218.     bcs    store_ercd
  1219.     move.l    d0,a1
  1220.     move.l    err_stock_size(pc),d2
  1221.     add.l    #256,d2            *もう256バイト確保
  1222.     move.l    d2,err_stock_size-work(a6)
  1223.     bsr    enlarge_mem
  1224.     tst.l    d0
  1225.     bmi    exit_sec        *out_of_memoryケース
  1226.     move.l    a0,err_stock_addr-work(a6)
  1227.     add.l    d1,a0
  1228.     bra    store_ercd_
  1229.  
  1230. .include    fopen.has
  1231.  
  1232. read:                *CNFファイルの読み込み
  1233.     * < d5.l=file handle
  1234.     * > a5=data address
  1235.     * > d3.l=size
  1236.     * X d0
  1237.     move.w    #2,-(sp)    *ファィルの長さを調べる
  1238.     clr.l    -(sp)
  1239.     move.w    d5,-(sp)
  1240.     DOS    _SEEK
  1241.      addq.w    #8,sp        *d0.l=file length
  1242.     move.l    d0,d3        *d3=length
  1243.     ble    file_len_error
  1244.  
  1245.     move.l    d0,-(sp)
  1246.     DOS    _MALLOC
  1247.     addq.w    #4,sp
  1248.     tst.l    d0
  1249.     bmi    mem_error    *OUT OF MEMORY
  1250.     move.l    d0,a5
  1251.  
  1252.     clr.w    -(sp)        *ファイルポインタを元に戻す
  1253.     clr.l    -(sp)
  1254.     move.w    d5,-(sp)
  1255.     DOS    _SEEK
  1256.     addq.w    #8,sp
  1257.  
  1258.     move.l    d3,-(sp)    *push size
  1259.     pea    (a5)        *push addr
  1260.     move.w    d5,-(sp)    *file handle
  1261.     DOS    _READ
  1262.     lea    10(sp),sp
  1263.     tst.l    d0
  1264.     bmi    read_error0    *読み込み失敗
  1265.  
  1266.     clr.l    -(sp)
  1267.     move.w    d5,-(sp)
  1268.     DOS    _FILEDATE
  1269.     addq.w    #6,sp
  1270.     move.l    d0,date_buf-work(a6)
  1271.  
  1272.     move.w    d5,-(sp)    *close
  1273.     DOS    _CLOSE
  1274.     addq.l    #2,sp
  1275.     rts
  1276.  
  1277. get_mem:
  1278.     * < d2.l=memory size
  1279.     * > d0.l=memory block address (or error code/ depends on _MALLOC)
  1280.     * > d2.l=long word border size
  1281.     * > a0.l=data address
  1282.     * - all
  1283.     addq.l    #3,d2
  1284.     andi.w    #$fffc,d2    *make it long word border
  1285.     move.l    d2,-(sp)
  1286.     DOS    _MALLOC
  1287.     addq.w    #4,sp
  1288.     tst.l    d0
  1289.     bmi    @f
  1290.     move.l    d0,a0
  1291. @@:
  1292.     rts
  1293.  
  1294. enlarge_mem:            *メモリブロックの拡大縮小
  1295.     * < d2.l=new memory size
  1296.     * < a1.l=now address
  1297.     * > d0.l=address (0:done it, error/ depends on _MALLOC)
  1298.     * > d2.l=long word border size
  1299.     * > a0.l=address
  1300.     * - all
  1301.     movem.l    a1-a2,-(sp)
  1302.     addq.l    #3,d2
  1303.     andi.w    #$fffc,d2    *Make it long word border
  1304.     move.l    a1,a0
  1305.     move.l    d2,-(sp)
  1306.     pea    (a1)
  1307.     DOS    _SETBLOCK
  1308.     addq.w    #8,sp
  1309.     tst.l    d0
  1310.     beq    exit_enlmm    *no error
  1311.     move.l    d2,-(sp)    *SETBLOCK出来ない時は新たにメモリ確保
  1312.     DOS    _MALLOC
  1313.     addq.w    #4,sp
  1314.     tst.l    d0
  1315.     bmi    exit_enlmm    *error
  1316.     move.l    d0,a0
  1317.     move.l    a0,a2
  1318.     pea    (a1)
  1319.     move.l    d2,d0
  1320. @@:                *旧メモリ内容を新メモリエリアへ複写
  1321.     move.l    (a1)+,(a2)+
  1322.     subq.l    #4,d0
  1323.     bhi    @b
  1324.     DOS    _MFREE        *メモリ開放
  1325.     addq.w    #4,sp
  1326. exit_enlmm:
  1327.     movem.l    (sp)+,a1-a2
  1328.     rts
  1329.  
  1330. free_mem:
  1331.     * < a1.l=data address
  1332.     * > d0.l=0 no error
  1333.     * - a1
  1334.     pea    (a1)
  1335.     DOS    _MFREE
  1336.     addq.w    #4,sp
  1337.     tst.l    d0
  1338.     bne    @f        *case error
  1339.     moveq.l    #0,d0
  1340. @@:
  1341.     rts
  1342.  
  1343. mk_capital:            *小文字→大文字(英字以外の場合はそのままthrough out)
  1344.     * < d0.b=letter chr
  1345.     cmpi.b    #'a',d0
  1346.     bcs    exit_mkcptl
  1347.     cmpi.b    #'z',d0
  1348.     bhi    exit_mkcptl
  1349.     andi.w    #$df,d0        *わざと.w
  1350. exit_mkcptl:
  1351.     rts
  1352.  
  1353. _skip_spc:
  1354. @@:
  1355.     tst.b    (a2)
  1356.     beq    @f
  1357.     cmpi.b    #' ',(a2)+    *最初のファイル名までスキップ
  1358.     bls    @b
  1359.     subq.w    #1,a2
  1360. @@:
  1361.     rts
  1362.  
  1363. skip_sep2:            *セパレータ','を1個だけスキップする
  1364.     movem.l    d0-d1,-(sp)    *(スペース/タブは複数スキップ、改行はスキップしない)
  1365.     moveq.l    #0,d1
  1366. skip_sep2_lp:
  1367.     cmp.l    a4,d4
  1368.     bls    exit_ss2l
  1369.     move.b    (a4)+,d0
  1370.     cmpi.b    #' ',d0
  1371.     beq    skip_sep2_lp
  1372.     cmpi.b    #09,d0
  1373.     beq    skip_sep2_lp
  1374.     cmpi.b    #',',d0
  1375.     bne    @f
  1376.     tas.b    d1
  1377.     beq    skip_sep2_lp
  1378.     bra    1f
  1379. @@:
  1380. *    cmpi.b    #':',d0
  1381. *    beq    exit_ss2l
  1382. *    cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  1383. *    beq    exit_ss2l
  1384. 1:
  1385.     subq.w    #1,a4
  1386. exit_ss2l:
  1387.     move.l    a4,line_ptr-work(a6)
  1388.     movem.l    (sp)+,d0-d1
  1389.     rts
  1390.  
  1391. skip_spc2:            *スペース/TABをスキップする
  1392.     move.w    d0,-(sp)    *(複数のスペース/TABをスキップ、改行はスキップしない)
  1393. sksp2_lp:
  1394.     cmp.l    a4,d4
  1395.     bls    exit_sksp2
  1396.     move.b    (a4)+,d0
  1397.     cmpi.b    #'/',d0
  1398.     bne    @f
  1399.     bsr    do_skip_comment
  1400.     bra    sksp2_lp
  1401. @@:
  1402.     cmpi.b    #' ',d0
  1403.     beq    sksp2_lp
  1404.     cmpi.b    #09,d0        *skip tab
  1405.     beq    sksp2_lp
  1406.     subq.w    #1,a4
  1407. exit_sksp2:
  1408.     move.l    a4,line_ptr-work(a6)
  1409.     move.w    (sp)+,d0
  1410.     rts
  1411.  
  1412. skip_plus:            *PLUSをスキップする
  1413.     move.w    d0,-(sp)
  1414. skpllp:
  1415.     cmp.l    a4,d4
  1416.     bls    exit_skpl
  1417.     move.b    (a4)+,d0
  1418.     cmpi.b    #'/',d0
  1419.     bne    @f
  1420.     bsr    do_skip_comment
  1421.     bra    skpllp
  1422. @@:
  1423.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  1424.     bne    @f
  1425.     cmpi.b    #$0d,d0
  1426.     beq    skpllp
  1427.     cmpi.b    #$0a,d0
  1428.     bne    @f
  1429.     bsr    cr_line
  1430.     bra    skpllp
  1431. @@:
  1432.     cmpi.b    #'+',d0
  1433.     beq    skpllp
  1434.     subq.w    #1,a4
  1435. exit_skpl:
  1436.     move.l    a4,line_ptr-work(a6)
  1437.     move.w    (sp)+,d0
  1438.     rts
  1439.  
  1440. skip_eq:            *'='をスキップする(スペースやタブも)
  1441.     move.w    d0,-(sp)
  1442. skip_eq_lp:
  1443.     cmp.l    a4,d4
  1444.     bls    exit_eql
  1445.     move.b    (a4)+,d0
  1446.     cmpi.b    #'/',d0
  1447.     bne    @f
  1448.     bsr    do_skip_comment
  1449.     bra    skip_eq_lp
  1450. @@:
  1451.     cmpi.b    #' ',d0
  1452.     beq    skip_eq_lp
  1453.     cmpi.b    #09,d0
  1454.     beq    skip_eq_lp
  1455.     cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  1456.     beq    skip_eq_lp
  1457.     cmpi.b    #':',d0
  1458.     beq    skip_eq_lp
  1459.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  1460.     bne    @f
  1461.     cmpi.b    #$0d,d0
  1462.     beq    skip_eq_lp
  1463.     cmpi.b    #$0a,d0
  1464.     bne    @f
  1465.     bsr    cr_line
  1466.     bra    skip_eq_lp
  1467. @@:
  1468.     subq.w    #1,a4
  1469. exit_eql:
  1470.     move.l    a4,line_ptr-work(a6)
  1471.     move.w    (sp)+,d0
  1472.     rts
  1473.  
  1474. skip_sep:            *セパレータを1個だけスキップする
  1475.     move.w    d0,-(sp)    *(スペース/タブ/改行は複数スキップする)
  1476. skip_sep_lp:
  1477.     cmp.l    a4,d4
  1478.     bls    exit_ssl
  1479.     move.b    (a4)+,d0
  1480.     cmpi.b    #'/',d0
  1481.     bne    @f
  1482.     bsr    do_skip_comment
  1483.     bra    skip_sep_lp
  1484. @@:
  1485.     cmpi.b    #' ',d0
  1486.     beq    skip_sep_lp
  1487.     cmpi.b    #09,d0
  1488.     beq    skip_sep_lp
  1489.     cmpi.b    #',',d0
  1490.     beq    exit_ssl
  1491. *    cmpi.b    #':',d0
  1492. *    beq    exit_ssl
  1493. *    cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  1494. *    beq    exit_ssl
  1495.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  1496.     bne    @f
  1497.     cmpi.b    #$0d,d0
  1498.     beq    skip_sep_lp
  1499.     cmpi.b    #$0a,d0
  1500.     bne    @f
  1501.     bsr    cr_line
  1502.     bra    skip_sep_lp
  1503. @@:
  1504.     subq.w    #1,a4
  1505. exit_ssl:
  1506.     move.l    a4,line_ptr-work(a6)
  1507.     move.w    (sp)+,d0
  1508.     rts
  1509.  
  1510. skip_spc:            *スペースをスキップする
  1511.     move.w    d0,-(sp)    *(複数のスペース/タブをスキップ、改行もスキップ)
  1512. sksplp:
  1513.     cmp.l    a4,d4
  1514.     bls    exit_sksp
  1515.     move.b    (a4)+,d0
  1516.     cmpi.b    #'/',d0
  1517.     bne    @f
  1518.     bsr    do_skip_comment
  1519.     bra    sksplp
  1520. @@:
  1521.     cmpi.b    #' ',d0
  1522.     beq    sksplp
  1523.     cmpi.b    #09,d0        *skip tab
  1524.     beq    sksplp
  1525.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  1526.     bne    @f            *ne:yes
  1527.     cmpi.b    #$0d,d0
  1528.     beq    sksplp
  1529.     cmpi.b    #$0a,d0
  1530.     bne    @f
  1531.     bsr    cr_line
  1532.     bra    sksplp
  1533. @@:
  1534.     subq.w    #1,a4
  1535. exit_sksp:
  1536.     move.l    a4,line_ptr-work(a6)
  1537.     move.w    (sp)+,d0
  1538.     rts
  1539.  
  1540. skip_spc0:            *スペースをスキップする(chk_num専用)
  1541.     move.w    d0,-(sp)    *(複数のスペース/タブをスキップ、改行もスキップ
  1542. sksplp0:            *ただし、テンポラリ的にスキップ)
  1543.     cmp.l    a4,d4
  1544.     bls    exit_sksp0
  1545.     move.b    (a4)+,d0
  1546.     cmpi.b    #'/',d0
  1547.     bne    @f
  1548.     bsr    do_skip_comment
  1549.     bra    sksplp0
  1550. @@:
  1551.     cmpi.b    #' ',d0
  1552.     beq    sksplp0
  1553.     cmpi.b    #09,d0            *skip tab
  1554.     beq    sksplp0
  1555.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  1556.     bne    @f            *ne:yes
  1557.     cmpi.b    #$0d,d0
  1558.     beq    sksplp0
  1559.     cmpi.b    #$0a,d0
  1560.     beq    sksplp0
  1561. @@:
  1562.     subq.w    #1,a4
  1563. exit_sksp0:
  1564. *    move.l    a4,line_ptr-work(a6)
  1565.     move.w    (sp)+,d0
  1566.     rts
  1567.  
  1568. chk_num:            *数字かどうかチェック(2進,16進数値の有無に付いても検知)
  1569.     * > eq=number
  1570.     * > mi=not num
  1571. reglist    reg    d0/a4
  1572.     movem.l    reglist,-(sp)
  1573. chknumlp:
  1574.     bsr    skip_spc0
  1575.     cmp.l    a4,d4
  1576.     bls    not_num
  1577.     move.b    (a4),d0
  1578.     cmpi.b    #'%',d0
  1579.     beq    bin_numchk
  1580.     cmpi.b    #'$',d0
  1581.     beq    hex_numchk
  1582.     cmpi.b    #'-',d0
  1583.     beq    @f
  1584.     cmpi.b    #'+',d0
  1585.     bne    chknum0
  1586. @@:                *もう一度検査へ
  1587.     addq.w    #1,a4
  1588.     bra    chknumlp
  1589. chknum0:
  1590.     cmpi.b    #'0',d0
  1591.     bcs    not_num
  1592.     cmpi.b    #'9',d0
  1593.     bhi    not_num
  1594. yes_num:
  1595.     movem.l    (sp)+,reglist
  1596.     move.w    #CCR_ZERO,ccr
  1597.     rts
  1598.  
  1599. bin_numchk:            *2進ケース
  1600.     addq.w    #1,a4        *skip %
  1601.     bsr    skip_spc0
  1602.     cmp.l    a4,d4
  1603.     bls    not_num
  1604.     move.b    (a4),d0
  1605.     cmpi.b    #'0',d0
  1606.     beq    yes_num
  1607.     cmpi.b    #'1',d0
  1608.     beq    yes_num
  1609. not_num:
  1610.     movem.l    (sp)+,reglist
  1611.     move.w    #CCR_NEGA,ccr
  1612.     rts
  1613.  
  1614. hex_numchk:            *16進ケース
  1615.     addq.w    #1,a4        *skip $
  1616.     bsr    skip_spc0
  1617.     cmp.l    a4,d4
  1618.     bls    not_num
  1619.     move.b    (a4),d0
  1620.     cmpi.b    #'0',d0
  1621.     bcs    not_num
  1622.     cmpi.b    #'9',d0
  1623.     bls    yes_num
  1624.     bsr    mk_capital
  1625.     cmpi.b    #'A',d0
  1626.     bcs    not_num
  1627.     cmpi.b    #'F',d0
  1628.     bhi    not_num
  1629.     bra    yes_num
  1630.  
  1631. chk_kanji:
  1632.     tst.b    d0
  1633.     bpl    @f        *normal characters
  1634.     cmpi.b    #$a0,d0        *漢字か
  1635.     bcs    cknj_yes
  1636.     cmpi.b    #$df,d0
  1637.     bls    @f
  1638. cknj_yes:
  1639.     move.w    #CCR_NEGA,ccr    *yes
  1640.     rts
  1641. @@:
  1642.     move.w    #CCR_ZERO,ccr    *no
  1643.     rts
  1644.  
  1645. get_num:            *数字文字列を数値へ
  1646.     * < (a4)=number strings
  1647.     * < d4=end of text addr.
  1648.     * > d1.l=value
  1649.     * > a4=next
  1650.     * - all
  1651. reglist    reg    d0/d2-d3
  1652.     bsr    skip_spc    *' ',tabなどをskip
  1653.     cmp.l    a4,d4
  1654.     beq    num_ret
  1655.     movem.l    reglist,-(sp)
  1656.     cmpi.b    #'-',(a4)
  1657.     seq    d2           *'-'ならマーク
  1658.     bne    get_num0
  1659.     addq.w    #1,a4        *skip '-'
  1660. get_num0:
  1661.     bsr    skip_plus
  1662.     bsr    skip_spc
  1663.  
  1664.     cmpi.b    #'$',(a4)
  1665.     beq    get_hexnum_
  1666.     cmpi.b    #'%',(a4)
  1667.     beq    get_binnum_
  1668.  
  1669.     moveq.l    #0,d1
  1670.     moveq.l    #0,d0
  1671. num_lp01:
  1672.     cmp.l    a4,d4
  1673.     bls    num_exitt
  1674.     move.b    (a4)+,d0
  1675. *    cmpi.b    #'_',d0
  1676. *    beq    num_lp01
  1677.     sub.b    #$30,d0
  1678.     bmi    num_exit
  1679.     cmp.b    #9,d0
  1680.     bhi    num_exit
  1681.  
  1682.     add.l    d1,d1
  1683.     move.l    d1,d3
  1684.     lsl.l    #2,d1
  1685.     add.l    d3,d1        *d1=d1*10
  1686.     add.l    d0,d1        *d1=d1+d0
  1687.     bra    num_lp01
  1688. num_exit:
  1689.     subq.w    #1,a4
  1690. num_exitt:
  1691.     tst.b    d2
  1692.     beq    @f
  1693.     neg.l    d1
  1694. @@:
  1695.     movem.l    (sp)+,reglist
  1696. num_ret:
  1697.     rts
  1698. get_hexnum_:            *16進数
  1699.     moveq.l    #0,d0
  1700.     moveq.l    #0,d1
  1701.     cmp.l    a4,d4
  1702.     bls    num_exitt
  1703.     addq.w    #1,a4
  1704.     bsr    skip_spc
  1705. __num_lp01_:
  1706.     cmp.l    a4,d4
  1707.     bls    num_exitt
  1708.     move.b    (a4)+,d0
  1709. *    cmpi.b    #'_',d0
  1710. *    beq    __num_lp01_
  1711.     bsr    mk_capital
  1712.     sub.b    #$30,d0
  1713.     bmi    num_exit
  1714.     cmp.b    #9,d0
  1715.     bls    calc_hex_
  1716.     cmpi.b    #17,d0
  1717.     bcs    num_exit
  1718.     cmpi.b    #22,d0
  1719.     bhi    num_exit
  1720.     subq.b    #7,d0
  1721. calc_hex_:
  1722.     lsl.l    #4,d1
  1723.     or.b    d0,d1
  1724.     bra    __num_lp01_
  1725. get_binnum_:            *2進数
  1726.     moveq.l    #0,d0
  1727.     moveq.l    #0,d1
  1728.     cmp.l    a4,d4
  1729.     bls    num_exitt
  1730.     addq.w    #1,a4
  1731.     bsr    skip_spc
  1732. b__num_lp01_:
  1733.     cmp.l    a4,d4
  1734.     bls    num_exitt
  1735.     move.b    (a4)+,d0
  1736. *    cmpi.b    #'_',d0
  1737. *    beq    b__num_lp01_
  1738.     cmpi.b    #'0',d0
  1739.     beq    calc_b_num__
  1740.     cmpi.b    #'1',d0
  1741.     bne    num_exit
  1742. calc_b_num__:
  1743.     sub.b    #$30,d0
  1744.     add.l    d1,d1
  1745.     or.b    d0,d1
  1746.     bra    b__num_lp01_
  1747.  
  1748. mk_note_num:                *ノート表示
  1749.     movem.l    d0-d1/a1,-(sp)
  1750.     lea    suji(pc),a1
  1751.     move.b    #'(',(a1)+
  1752.     divu    #128,d0
  1753.     add.b    #$31,d0            *bank
  1754.     move.b    d0,(a1)+
  1755.     move.b    #':',(a1)+
  1756.     clr.w    d0
  1757.     swap    d0
  1758.     divu    #12,d0
  1759.     moveq.l    #$2f,d1
  1760.     add.b    d1,d0
  1761.     cmp.b    d1,d0
  1762.     bhi    @f
  1763.     move.b    #'-',2(a1)
  1764.     move.b    #'1',3(a1)
  1765.     move.b    #')',4(a1)
  1766.     clr.b    5(a1)
  1767.     bra    dnd0
  1768. @@:
  1769.     move.b    d0,2(a1)
  1770.     move.b    #')',3(a1)
  1771.     move.b    #' ',4(a1)
  1772.     clr.b    5(a1)
  1773. dnd0:
  1774.     swap    d0
  1775.     add.w    d0,d0
  1776.     move.b    nn(pc,d0.w),(a1)+
  1777.     move.b    nn+1(pc,d0.w),(a1)+
  1778.     movem.l    (sp)+,d0-d1/a1
  1779.     rts
  1780.  
  1781. nn:    dc.b    'C '
  1782.     dc.b    'C#'
  1783.     dc.b    'D '
  1784.     dc.b    'D#'
  1785.     dc.b    'E '
  1786.     dc.b    'F '
  1787.     dc.b    'F#'
  1788.     dc.b    'G '
  1789.     dc.b    'G#'
  1790.     dc.b    'A '
  1791.     dc.b    'A#'
  1792.     dc.b    'B '
  1793.  
  1794. chk_optsw:                *オプションスイッチ
  1795.     * < a2.l=cmd line
  1796. optsw_lp:
  1797.     move.b    (a2)+,d0
  1798.     cmpi.b    #'/',d0
  1799.     beq    @f
  1800.     cmpi.b    #'-',d0
  1801.     bne    exit_optsw
  1802. @@:
  1803.     bsr    _skip_spc
  1804.     move.b    (a2)+,d0
  1805.     beq    print_hlp
  1806.     bsr    mk_capital
  1807.     cmpi.b    #'J',d0            *日本語表示
  1808.     beq    japanese_mode
  1809. *    cmpi.b    #'H',d0
  1810. *    beq    print_hlp
  1811. *    cmpi.b    #'?',d0
  1812. *    beq    print_hlp
  1813.     bra    print_hlp
  1814. exit_optsw:
  1815.     subq.w    #1,a2
  1816.     rts
  1817. japanese_mode:                *日本語表示
  1818.     st.b    errmes_lang-work(a6)
  1819.     bra    optsw_lp
  1820.  
  1821. get_string:
  1822.     * < d1.w=最大文字数-1
  1823.     * > d3.l=文字数
  1824.     moveq.l    #0,d3
  1825.     bsr    skip_spc
  1826. tmtlp:
  1827.     cmp.l    a4,d4
  1828.     bls    m_string_break_off        *文字列が途中で終わっている
  1829.     move.b    (a4)+,d0
  1830.     bsr    chk_kanji        *漢字かどうかチェック
  1831.     bpl    @f
  1832.     bsr    do_wrt_cmn_b
  1833.     addq.w    #1,d3            *ins str len
  1834.     subq.w    #1,d1
  1835.     bcs    exit_gtstr
  1836.     cmp.l    a4,d4
  1837.     bls    m_string_break_off    *文字列が中途半端
  1838.     move.b    (a4)+,d0
  1839.     bra    tmtstr_next
  1840. @@:
  1841.     cmp.b    #$0a,d0
  1842.     bne    @f
  1843.     bsr    cr_line            *改行
  1844.     bra    exit_gtstr
  1845. @@:
  1846.     cmpi.b    #'=',d0
  1847.     bne    @f
  1848.     cmp.l    a4,d4            *={ は一組で考える
  1849.     bls    tmtstr_next
  1850.     cmpi.b    #'{',(a4)
  1851.     bne    tmtstr_next
  1852.     addq.w    #1,a4
  1853.     bra    exit_gtstr
  1854. @@:
  1855.     cmp.b    #'{',d0            *文字列終了
  1856.     beq    exit_gtstr
  1857. tmtstr_next:
  1858.     bsr    do_wrt_cmn_b
  1859.     addq.w    #1,d3            *ins str len
  1860.     dbra    d1,tmtlp
  1861. skip_gtstr:                *規定文字数より長い文字列はスキップ
  1862.     cmp.l    a4,d4
  1863.     bls    m_string_break_off    *文字列が途中で終わっている
  1864.     move.b    (a4)+,d0
  1865.     bsr    chk_kanji        *漢字かどうかチェック
  1866.     bpl    @f
  1867.     cmp.l    a4,d4
  1868.     bls    m_string_break_off    *文字列が中途半端
  1869.     move.b    (a4)+,d0
  1870.     bra    skip_gtstr
  1871. @@:
  1872.     cmp.b    #$0a,d0
  1873.     bne    @f
  1874.     bsr    cr_line            *改行
  1875.     bra    exit_gtstr
  1876. @@:
  1877.     cmp.b    #'{',d0            *文字列終了
  1878.     bne    skip_gtstr
  1879. exit_gtstr:
  1880.     rts
  1881.  
  1882. bye_bye_:            *書きだしファイル名表示
  1883.     pea    d_name(pc)
  1884.     DOS    _PRINT
  1885.     addq.w    #4,sp
  1886.     bra    @f
  1887.  
  1888. bye_bye:            *ソースファイル名表示
  1889.     pea    s_name(pc)
  1890.     DOS    _PRINT
  1891.     addq.w    #4,sp
  1892. @@:
  1893.     move.l    line_number(pc),d1
  1894.     beq    @f
  1895.  
  1896.     pea    TAB(pc)        *行番号表示
  1897.     DOS    _PRINT
  1898.     addq.w    #4,sp
  1899.  
  1900.     move.l    d1,d0
  1901.     bsr    num_to_str
  1902.     pea    suji(pc)
  1903.     DOS    _PRINT        *line number
  1904.     addq.w    #4,sp
  1905. @@:
  1906.     pea    TAB(pc)
  1907.     DOS    _PRINT
  1908.     addq.w    #4,sp
  1909. _bye_bye:            *エラーメッセージだけ
  1910.     bsr    bil_prta1_
  1911. go_bye:
  1912.     DOS    _ALLCLOSE
  1913.  
  1914.     move.w    #$07,-(sp)    *beep
  1915.     clr.w    -(sp)
  1916.     DOS    _CONCTRL
  1917.     addq.w    #4,sp
  1918.  
  1919.     pea    d_name(pc)    *未完成出力ファイル消去
  1920.     DOS    _DELETE
  1921.     addq.w    #4,sp
  1922.  
  1923.     move.w    #1,-(sp)    *エラー
  1924.     DOS    _EXIT2
  1925.  
  1926. ropen_error:
  1927.     lea    rop_er_mes(pc),a1
  1928.     bra    bye_bye
  1929.  
  1930. wopen_error:
  1931.     lea    wop_er_mes(pc),a1
  1932.     bra    bye_bye_
  1933.  
  1934. read_error0:
  1935.     lea    red_er_mes0(pc),a1
  1936.     bra    bye_bye
  1937.  
  1938. write_error:
  1939.     lea    wrt_er_mes(pc),a1
  1940.     bra    bye_bye_
  1941.  
  1942. dev_full:
  1943.     lea    dev_ful_mes(pc),a1
  1944.     bra    _bye_bye        *エラーメッセージだけ
  1945.  
  1946. mem_error:                *メモリ不足
  1947.     lea    mem_er_mes(pc),a1
  1948.     bra    bye_bye
  1949.  
  1950. file_len_error:
  1951.     lea    fil_er_mes(pc),a1
  1952.     bra    bye_bye
  1953.  
  1954. pointer_error:
  1955.     lea    ptr_er_mes(pc),a1
  1956.     bra    bye_bye
  1957.  
  1958. print_hlp:                *ヘルプの表示
  1959.     bsr    print_title
  1960.  
  1961.     lea    hlp_mes(pc),a1
  1962.     bsr    bil_prta1
  1963.  
  1964.     move.w    #1,-(sp)
  1965.     DOS    _EXIT2
  1966.  
  1967. print_title:                *タイトルの表示
  1968.     pea    (a1)
  1969.     lea    title_mes(pc),a1
  1970.     bsr    prta1
  1971.     move.l    (sp)+,a1
  1972.     rts
  1973.  
  1974. bil_prta1:                *日本語対応
  1975.     tst.b    errmes_lang-work(a6)    *0:英語か 1:日本語か
  1976.     beq    prta1
  1977. @@:                    *次のメッセージをゲット
  1978.     tst.b    (a1)+
  1979.     bne    @b
  1980. prta1:
  1981.     move.w    #2,-(sp)
  1982.     pea    (a1)
  1983.     DOS    _FPUTS
  1984.     addq.w    #6,sp
  1985.     rts
  1986.  
  1987. bil_prta1_:                *日本語対応
  1988.     tst.b    errmes_lang-work(a6)    *0:英語か 1:日本語か
  1989.     beq    prta1_
  1990. @@:                    *次のメッセージをゲット
  1991.     tst.b    (a1)+
  1992.     bne    @b
  1993. prta1_:
  1994.     pea    (a1)
  1995.     DOS    _PRINT
  1996.     addq.w    #4,sp
  1997.     rts
  1998.  
  1999. *SPC:                *print space
  2000. *    lea    spc_data(pc),a1
  2001. *    bra    prta1
  2002. *EQU:
  2003. *    lea    equ_data(pc),a1
  2004. *    bra    prta1
  2005. PTT:
  2006.     lea    ptt_data(pc),a1
  2007.     bra    prta1
  2008. OK:
  2009.     lea    ok_data(pc),a1
  2010.     bra    prta1
  2011. RET:
  2012.     lea    CRLF(pc),a1
  2013.     bra    prta1
  2014.  
  2015.     .data
  2016. work:
  2017. title_mes:
  2018.     dc.b    'Z-MUSIC PCM FILE CONVERTER '
  2019.     dc.b    $f3,'V',$F3,'E',$F3,'R',$F3,'S',$F3,'I',$F3,'O',$F3,'N'
  2020.     version
  2021.     test
  2022.     dc.b    ' (C) 1991,97 ZENJI SOFT',13,10,0
  2023. hlp_mes:
  2024.     dc.b    '< USAGE > '
  2025.     dc.b    'ZPCNV3.R [Optional Switches] <FILENAME1[.CNF]> [FILENAME2[.ZPD]]',13,10
  2026.     dc.b    '< OPTIONAL SWITCHES >',13,10
  2027.     dc.b    '-? or H Display the list of optional switches.',13,10
  2028.     dc.b    '-J      Messages will be displayed in Japanese.',13,10
  2029.     dc.b    0
  2030.     dc.b    '< 使用方法 > '
  2031.     dc.b    'ZPCNV3.R [オプション] <ファイル名1[.CNF]> [ファイル名2[.ZPD]]',13,10
  2032.     dc.b    '< オプション >',13,10
  2033.     dc.b    '-? or H ヘルプ表示.',13,10
  2034.     dc.b    '-J      日本語メッセージ表示',13,10
  2035.     dc.b    0
  2036. rop_er_mes:
  2037.     dc.b    'File open error. Does the FILENAME1 file surely exist?',13,10,0
  2038.     dc.b    'ファイルが開けませんでした。FILENAME1が存在するか確認してください。',13,10,0
  2039. wop_er_mes:
  2040.     dc.b    'File open error. Check the legitimacy of FILENAME2.',13,10,0
  2041.     dc.b    'ファイルが開けませんでした。FILENAME2が適正なファイル名か確認してください。',13,10,0
  2042. red_er_mes0:
  2043.     dc.b    'File read error. Check the legitimacy of FILENAME1.',13,10,0
  2044.     dc.b    '読み込みエラーです。FILENAME1が正常か確認してください。',13,10,0
  2045. wrt_er_mes:
  2046.     dc.b    'File write error. Check the legitimacy of FILENAME2.',13,10,0
  2047.     dc.b    '書き込みエラーです。FILENAME2が正常か確認してください。',13,10,0
  2048. dev_ful_mes:
  2049.     dc.b    'Device full.',13,10,0
  2050.     dc.b    'ディスク容量が不足しています。',13,10,0
  2051. mem_er_mes:
  2052.     dc.b    'Out of memory.',13,10,0
  2053.     dc.b    'メモリが不足しています。',13,10,0
  2054. fil_er_mes:
  2055.     dc.b    'Illegal File size.',13,10,0
  2056.     dc.b    'ファイルサイズが異常です。',13,10,0
  2057. ptr_er_mes:
  2058.     dc.b    'Illegal pointer error.',13,10,0
  2059.     dc.b    'ポインタが異常です。',13,10,0
  2060. ers_mes:    dc.b    'ERASED',13,10,0
  2061. reg_mes:    dc.b    $1b,'[u',$1b,'[0KOK',13,10,0
  2062. ovw_reg_mes:    dc.b    $1b,'[u',$1b,'[0KOVER WRITTEN',13,10,0
  2063.  
  2064. compiling:    dc.b    'COMPILING ',0
  2065. proc:        dc.b    'PROCESSING',0
  2066. saving:        dc.b    'CREATING  ',0
  2067. executing:    dc.b    'EXECUTING ',0
  2068. no_er_mes:    dc.b    'Operations are all set.',13,10
  2069.         dc.b    'A ♪SOUND mind in a SOUND body.',13,10,0
  2070. spc_data:    dc.b    ' ',0
  2071. ptt_data:    dc.b    ' ... ',$1b,'[s',0
  2072. ok_data:    dc.b    'OK',13,10,0
  2073. CRLF:        dc.b    13,10,0
  2074. TAB:        dc.b    9,0
  2075.         dc.b    9
  2076. suji:        ds.b    16
  2077. kc_value:    *A  B  C  D  E  F  G
  2078.     dc.b    09,11,00,02,04,05,07
  2079. zpcnv3_opt:    dc.b    'zpcnv3_opt',0
  2080. errmes_lang:    dc.b    0            *日本語モード
  2081.  
  2082. shp_com_tbl:    *共通コマンド
  2083.     dc.b    'INCLUDE',0
  2084.     dc.b    '16BITPCM_TIMBRE',0
  2085.     dc.b    '16BITPCM_TONE',0
  2086.     dc.b    '8BITPCM_TIMBRE',0
  2087.     dc.b    '8BITPCM_TONE',0
  2088.     dc.b    'ADPCM_BANK',0
  2089.     dc.b    'ADPCM_TIMBRE',0
  2090.     dc.b    'ADPCM_TONE',0
  2091.     dc.b    'ERASE',0
  2092.     dc.b    'O',0
  2093.     dc.b    'EXECUTE',0
  2094.     dc.b    -1
  2095.     .even
  2096. exp_tbl:
  2097.     dc.l    1000000000
  2098.     dc.l    100000000
  2099.     dc.l    10000000
  2100.     dc.l    1000000
  2101.     dc.l    100000
  2102.     dc.l    10000
  2103.     dc.l    1000
  2104.     dc.l    100
  2105.     dc.l    10
  2106.     dc.l    1
  2107.  
  2108. scaleval:
  2109.     dc.w     16,17,19,21,23,25,28
  2110.     dc.w     31,34,37,41,45,50,55
  2111.     dc.w     60,66,73,80,88,97,107
  2112.     dc.w     118,130,143,157,173,190,209
  2113.     dc.w     230,253,279,307,337,371,408
  2114.     dc.w     449,494,544,598,658,724,796
  2115.     dc.w     876,963,1060,1166,1282,1411,1552
  2116. levelchg:
  2117.     dc.w    -1,-1,-1,-1,2,4,6,8
  2118.     dc.w    -1,-1,-1,-1,2,4,6,8
  2119.  
  2120. zpdhdr:        dc.l    ZPDV3_0,ZPDV3_1,0,0
  2121.  
  2122. adpcm_bank:    dc.w    0
  2123. err_stock_addr:    ds.l    1    *エラーを溜めておくところ
  2124. err_stock_size:    ds.l    1    *
  2125. err_stock_now:    ds.l    1    *
  2126. adpcm_tbl:        ds.l    1    *ADPCM DATAのADDRESSテーブル(note)[0]    !!
  2127. adpcm_n_max:        ds.w    1    *定義できる最大数(ノート方式)[0]    !!
  2128. adpcm_tbl2:        ds.l    1    *ADPCM DATAのADDRESSテーブル2(timbre)[0]    #
  2129. adpcm_n_max2:        ds.w    1    *定義できる最大数(音色形式)[0]            #
  2130. adpcm_buffer_top:    ds.l    1    *ADPCM DATA BUFFER TOP ADDRESS
  2131. adpcm_buffer_size:    ds.l    1    *ADPCM DATA BUFFER SIZE
  2132. adpcm_buffer_end:    ds.l    1    *ADPCM DATA BUFFER END ADDRESS
  2133. line_number:    ds.l    1    *ソース行番号[0]
  2134.  
  2135.     .include    zmerrmes.s
  2136.  
  2137.     .bss
  2138. rv_p:        ds.b    1
  2139.     .even
  2140. env_bak:    ds.l    1
  2141. date_buf:    ds.l    1
  2142. fade_p:        ds.l    1
  2143. pitch_p:    ds.l    1
  2144. vol_p:        ds.l    1
  2145. mix_note:    ds.l    1    *ADPCM登録コマンドワーク
  2146. mix_delay:    ds.l    1    *ADPCM登録コマンドワーク
  2147. fade_delay:    ds.l    1    *ADPCM登録コマンドワーク
  2148. fade_size:    ds.l    1    *ADPCM登録コマンドワーク
  2149. cut_offset:    ds.l    1    *ADPCM登録コマンドワーク
  2150. cut_size:    ds.l    1    *ADPCM登録コマンドワーク
  2151. last_val:    ds.w    1    *0
  2152. sfh:        ds.w    1
  2153. filename:    ds.l    1
  2154. line_ptr:    ds.l    1    *ソース行番号[0]
  2155. line_locate:    ds.l    1    *ソース行位置[0]
  2156. n_of_err:    ds.l    1    *発生したエラーの数[0]
  2157. zms_addr:    ds.l    1    *ZMD格納アドレス
  2158. zmd_addr:    ds.l    1    *ZMD格納アドレス
  2159. zmd_size:    ds.l    1    *ZMD格納バッファサイズ
  2160. zmd_end:    ds.l    1    *ZMD格納バッファ最終アドレス
  2161. sp_buf:        ds.l    1    *コンパイル時のスタック保存ワーク
  2162. fopen_name:    ds.l    1    *fopenで取り扱った最後のファイル名
  2163. csa_regnote:    ds.l    1    *ADPCM登録コマンドワーク
  2164. csa_regtype:    ds.l    1    *ADPCM登録コマンドワーク
  2165. temp_buffer:    ds.l    1    *一時的な作業エリア(include)
  2166. open_fn:    ds.l    1
  2167. adnt_regtype:    dc.l    0        *登録タイプ(下3バイト未使用)
  2168. adnt_work:    dc.w    0        *変換処理ありかなしか    !!!ファンクション$10用ワーク
  2169. adnt_regnote:    dc.w    0        *登録先ノート番号    !!!
  2170. adnt_lp_start:    dc.l    0        *loop start offset    !!!
  2171. adnt_lp_end:    dc.l    0        *loop end offset    !!!
  2172. adnt_lp_time:    dc.l    0        *loop time        !!!
  2173. v_buffer:    ds.l    1
  2174. erfn_addr:    ds.l    1    *エラーが発生したソースのファイル名の格納領域
  2175. erfn_size:    ds.l    1
  2176. erfn_now:    ds.l    1
  2177. *erfn_recent0:    ds.l    1
  2178. *erfn_recent1:    ds.l    1
  2179. zms_file_id:    ds.l    1    *ソースファイルネームID([0],1,2,...)
  2180. include_depth:    ds.l    1    *インクルードの深さ[0]
  2181. reg_n:        ds.w    1
  2182. prsv_work:    ds.b    64    *スタック保存
  2183.     .even
  2184. s_name:        ds.b    92
  2185. d_name:        ds.b    92
  2186. suji2:        ds.b    16    *数値表示用2
  2187. now_cmd:    ds.b    1    *0:複数行に渡る  1:1行で終結
  2188. OVW_flag:    ds.b    1    *上書きされたかどうかを表すフラグ
  2189.     .even
  2190.         ds.l    1024
  2191. user_sp:
  2192.